package pe.com.casadesign.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.casadesign.dao.ReporteDAO;
import pe.com.casadesign.domain.OperacionResultado;
import pe.com.casadesign.domain.LineaReporteInventario;
import pe.com.casadesign.domain.LineaReporteProducto;
import pe.com.casadesign.domain.LineaReporteGuia;
import pe.com.casadesign.domain.LineaReporteVentaDetalle;
import pe.com.casadesign.service.ReporteService;
import pe.com.casadesign.service.util.Constantes;
import pe.com.casadesign.service.util.Funciones;
import pe.com.casadesign.domain.AjusteInventario;
import pe.com.casadesign.domain.Inventario;
import pe.com.casadesign.domain.LineaAjusteInventario;
import pe.com.casadesign.domain.ReporteInventario;
import pe.com.casadesign.domain.ReporteSolicitud;
import pe.com.casadesign.domain.ReporteVenta;
import pe.com.casadesign.domain.ReporteVentaDetalle;
import pe.com.casadesign.domain.ReporteProducto;
import pe.com.casadesign.domain.ReporteGuia;
import pe.com.casadesign.domain.ReporteGuiaCabecera;
import pe.com.casadesign.domain.ReporteProveedor;

/**
 * Implementacion de ProductoService.
 * 
 * @author GS1
 * 
 */
@Service
public class ReporteServiceImpl implements ReporteService {
	private static final Logger logger = LoggerFactory.getLogger(ReporteServiceImpl.class);

	@Autowired
	private ReporteDAO reporteDAO;

	@Override
	public ReporteInventario obtenerReporteInventario(Inventario inventario) {
		ReporteInventario reporteInventario = reporteDAO.obtenerReporteInventario(inventario);
		for (LineaReporteInventario lineaReporteInventario : reporteInventario.getListaLineaReporteInventario().getLista()) {

			try {
				String dataImagen = Funciones.leerArchivo(lineaReporteInventario.getProducto().getCodigo());
				lineaReporteInventario.getProducto().setImagen(dataImagen);
			} catch (Exception e) {
				logger.error("error al leer Imagen", e);
			}
		}
		return reporteInventario;
	}
	
	@Override
	public ReporteInventario obtenerReporteInventarioSistema(Inventario inventario) {
		ReporteInventario reporteInventario = reporteDAO.obtenerReporteInventarioSistema(inventario);
		for (LineaReporteInventario lineaReporteInventario : reporteInventario.getListaLineaReporteInventario().getLista()) {

			try {
				String dataImagen = Funciones.leerArchivo(lineaReporteInventario.getProducto().getCodigo());
				lineaReporteInventario.getProducto().setImagen(dataImagen);
			} catch (Exception e) {
				logger.error("error al leer Imagen", e);
			}
		}
		return reporteInventario;
	}

	@Override
	public ReporteVenta obtenerReporteVentaxFecha(ReporteSolicitud reporteSolicitud){
		ReporteVenta reporteVenta = reporteDAO.obtenerReporteVentaxFecha(reporteSolicitud);
		
		return reporteVenta;
	}
	
	@Override
	public ReporteVenta obtenerReporteVentaxProducto(ReporteSolicitud reporteSolicitud){
        ReporteVenta reporteVenta = reporteDAO.obtenerReporteVentaxProducto(reporteSolicitud);
		
		return reporteVenta;
	}
	
	@Override
	public ReporteVenta obtenerReporteVentaxCliente(ReporteSolicitud reporteSolicitud){
        ReporteVenta reporteVenta = reporteDAO.obtenerReporteVentaxCliente(reporteSolicitud);
		
		return reporteVenta;
	}
	
	@Override
	public ReporteVenta obtenerReporteVentaxDecorador(ReporteSolicitud reporteSolicitud){
        ReporteVenta reporteVenta = reporteDAO.obtenerReporteVentaxDecorador(reporteSolicitud);
		
		return reporteVenta;
	}
	
	@Override
	public ReporteProducto obtenerReporteProductoxOrigen(ReporteSolicitud reporteSolicitud){
		ReporteProducto reporteProducto = reporteDAO.obtenerReporteProductoxOrigen(reporteSolicitud);
		for (LineaReporteProducto lineaReporteProducto : reporteProducto.getListaLineaReporteProducto().getLista()) {
			
			try {
				String dataImagen = Funciones.leerArchivo(lineaReporteProducto.getProducto().getCodigo());
				lineaReporteProducto.getProducto().setImagen(dataImagen);
			} catch (Exception e) {
				logger.error("error al leer Imagen", e);
			}
		}
		return reporteProducto;
	}
	
	@Override
	public ReporteProducto obtenerReporteProductoxProveedor(ReporteSolicitud reporteSolicitud){
		ReporteProducto reporteProducto = reporteDAO.obtenerReporteProductoxProveedor(reporteSolicitud);
        for (LineaReporteProducto lineaReporteProducto : reporteProducto.getListaLineaReporteProducto().getLista()) {
			
			try {
				String dataImagen = Funciones.leerArchivo(lineaReporteProducto.getProducto().getCodigo());
				lineaReporteProducto.getProducto().setImagen(dataImagen);
			} catch (Exception e) {
				logger.error("error al leer Imagen", e);
			}
		}
		return reporteProducto;
	}
	
	@Override
	public ReporteGuiaCabecera obtenerReporteDespachosxTienda(ReporteSolicitud reporteSolicitud){
		ReporteGuiaCabecera reporteGuiaCabecera = reporteDAO.obtenerReporteDespachosxTienda(reporteSolicitud);
		
		return reporteGuiaCabecera;
	}
	
	@Override
	public ReporteGuia obtenerReporteContenidoGuia(ReporteSolicitud reporteSolicitud){
		ReporteGuia reporteGuia = reporteDAO.obtenerReporteContenidoGuia(reporteSolicitud);

		for (LineaReporteGuia lineaReporteGuia : reporteGuia.getListaLineaReporteGuia().getLista()) {
			
			try {
				String dataImagen = Funciones.leerArchivo(lineaReporteGuia.getLineaGuia().getProducto().getCodigo());
				lineaReporteGuia.getLineaGuia().getProducto().setImagen(dataImagen);
			} catch (Exception e) {
				logger.error("error al leer Imagen", e);
			}
		}
		
		return reporteGuia;
	}
	
	@Override
	public ReporteGuiaCabecera obtenerReportePrestamosxTienda(ReporteSolicitud reporteSolicitud){
		ReporteGuiaCabecera reporteGuiaCabecera = reporteDAO.obtenerReportePrestamosxTienda(reporteSolicitud);
		
		return reporteGuiaCabecera;
	}
	
	@Override
	public ReporteProveedor obtenerReporteProveedorxPais(ReporteSolicitud reporteSolicitud){
		ReporteProveedor reporteProveedor = reporteDAO.obtenerReporteProveedorxPais(reporteSolicitud);
		
		return reporteProveedor;
	}
	
	@Override
	public ReporteVentaDetalle obtenerReporteContenidoFactura(ReporteSolicitud reporteSolicitud){
		ReporteVentaDetalle reporteVentaDetalle = reporteDAO.obtenerReporteContenidoFactura(reporteSolicitud);
		
		for (LineaReporteVentaDetalle lineaReporteVentaDetalle : reporteVentaDetalle.getListaLineaReporteVentaDetalle().getLista()) {
			
			try {
				String dataImagen = Funciones.leerArchivo(lineaReporteVentaDetalle.getLineaVenta().getProducto().getCodigo());
				lineaReporteVentaDetalle.getLineaVenta().getProducto().setImagen(dataImagen);
			} catch (Exception e) {
				logger.error("error al leer Imagen", e);
			}
		}
		
		return reporteVentaDetalle;
	}
	
	@Override
	public AjusteInventario obtenerAjusteInventarioSobrantes(Inventario inventario){
		AjusteInventario ajusteInventario = reporteDAO.obtenerAjusteInventarioSobrantes(inventario);
      return ajusteInventario;
	}
	
	@Override
	public AjusteInventario obtenerAjusteInventarioFaltantes(Inventario inventario){
		AjusteInventario ajusteInventario = reporteDAO.obtenerAjusteInventarioFaltantes(inventario);
      return ajusteInventario;
	}

	@Override
	public AjusteInventario obtenerListaItemSobrantes(Inventario inventario){
		AjusteInventario ajusteInventario = reporteDAO.obtenerListaItemSobrantes(inventario);
      return ajusteInventario;
	}
	
	@Override
	public AjusteInventario obtenerListaItemFaltantes(Inventario inventario){
		AjusteInventario ajusteInventario = reporteDAO.obtenerListaItemFaltantes(inventario);
      return ajusteInventario;
	}
}
